package blackboard;

/**
 * 
 * @author .
 * 
 */
public class Blackboard {

	public static int nroJugadas;
	protected static int table[][] = new int[3][3];
	public static boolean gameOver;
	protected int idGanador;

	public Blackboard() {
		initialize();
	}

	/**
	 * Inicializar el tablero.
	 */
	public void initialize() {
		nroJugadas = 0;
		idGanador = -1;

		for (int i = 0; i < 3; i++)
			for (int j = 0; j < 3; j++)
				table[i][j] = -1;

		gameOver = false;
	}

	/**
	 * Actualizar el estado del tablero.
	 * 
	 * @param i
	 *            fila
	 * @param j
	 *            columna
	 * @param id
	 *            Id del jugador.
	 */
	public void update(int i, int j, int id) {
		nroJugadas++;
		table[i][j] = id;

		if (hayGanador(i, j, id))
			Blackboard.gameOver = true;
	}

	/**
	 * Inspecciona el casillero ij del tablero.
	 * 
	 * @param i
	 *            fila
	 * @param j
	 *            columna
	 * @param id
	 *            Id del jugador
	 * @return True si el casillero ij no fue marcado.
	 */
	public boolean inspect(int i, int j, int id) {

		if ((!gameOver) && (table[i][j] == -1))
			return true;

		else
			return false;

	}

	/**
	 * Indica si puede considerarse un ganador.
	 * 
	 * @param i
	 *            fila
	 * @param j
	 *            columna
	 * @param id
	 *            Id del jugador
	 * @return True si existe un ganador
	 */
	private boolean hayGanador(int i, int j, int id) {

		if (nroJugadas >= 5) {
			if (solucion(id)) {
				idGanador = id;
				return true;
			} else
				return false;
		} else
			return false;
	}

	/**
	 * Indica si existe una solucion
	 * 
	 * @param idJ
	 *            Id del jugador
	 * @return True si el jugador idJ es el ganador.
	 */
	private boolean solucion(int idJ) {
		int id = -1;

		for (int i = 0; i < 3 && id == -1; i++) {
			if (table[i][0] == table[i][1] && table[i][1] == table[i][2])
				id = table[i][0];

			if (id == -1 && table[0][i] == table[1][i]
					&& table[1][i] == table[2][i])
				id = table[0][i];
		}

		if (id == -1 && table[0][0] == table[1][1]
				&& table[1][1] == table[2][2])
			id = table[0][0];

		if (id == -1 && table[2][0] == table[1][1]
				&& table[1][1] == table[0][2])
			id = table[0][0];

		return id != -1 && idJ == id;
	}

	public int getGanador() {
		return idGanador;
	}

}
